package Creche.Main;

import java.io.Serializable;
import java.util.ArrayList;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;

import Creche.Donnees.Actualite;
import Creche.Donnees.Adresse;
import Creche.Donnees.Donnee;
import Creche.Personne.Personne;

/**
 * Descripteur de cr�che
 * Contient des informations telles que son nom, sa position
 * (adresse et position GPS), et les Donn�es propres � une cr�che
 * crechebook --username magras.steve@gmail.com
 * tX3Hx3Dc8We7
 */
@SuppressWarnings("serial")
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Creche implements Serializable {
	
	@PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

	@Persistent
	private String nom;
	
	private Adresse adresse;
	
	@Persistent
	private Integer like;
	
    @Persistent
	private ArrayList<Donnee> donnees;
	
    @Persistent
    private ArrayList<Actualite> actus;
    
    @Persistent
    private ArrayList<Personne> enfants;
    
	/**
	 * On construit une cr�che avec toutes les informations n�cessaires
	 * @param nom, nom de la cr�che
	 * @param adresse, objet Localisation
	 * @param donnees, liste des donn�es de la cr�ches
	 */
	public Creche(String nom, Adresse adresse, ArrayList<Donnee> donnees, 
			ArrayList<Actualite> actus) {
		key = KeyFactory.createKey(Creche.class.getSimpleName(), adresse.getVille()+":"+nom);
		this.nom = nom;
		this.adresse = adresse;
		this.donnees = donnees;
		this.actus = actus;
		this.like = 0;
	}
	
	public Key getKey() {
		return key;
	}
	
	/**
	 * Obtention du nom de la cr�che
	 * @return nom de la cr�che
	 */
	public String getNom() {
		return nom;
	}
	
	public Adresse getAdresse() {
		return adresse;
	}
	
	
	public Integer getLike()
	{
		return like;
	}
	
	public void addLike()
	{
		like = like+1;
	}
	
	/**
	 * Obtention d'une donn�e par son nom
	 * on va parcourrir la liste de donn�e et on retournera null si on
	 * ne trouve rien
	 * @param nom, nom de la donn�e � chercher
	 * @return la donn�e trouv�e ou null
	 */
	public Donnee getDonneeParNom(String nom) {
		Donnee resultat = null;
		for (int i =0; i < donnees.size(); i++) {
			resultat = donnees.get(i);
			if (resultat.getLabel().equals(nom)){
				i = donnees.size();
			}
		}
		return resultat;
	}
	
	/**
	 * Obtention des donn�es hors actualit�s on retournera la liste 
	 * des Donnee
	 * @return une ArrayList de Donnee
	 */
	public ArrayList<Donnee> getSeulementDonnees() {
		return donnees;
	}
	
	/**
	 * Obtention de la liste des Actualite 
	 * @return une ArrayList de Actuelite
	 */
	public ArrayList<Actualite> getActu() {
		ArrayList<Actualite> resultat = new ArrayList<Actualite>();
		for (int i = 0; i < actus.size();i++){
			if (!((Actualite)actus.get(i)).estPassee()){
				resultat.add((Actualite) actus.get(i));
			} else {
				actus.remove(i);
			}
		}
		return resultat;
	}
	
	/**
	 * Ajout d'une donn�e pass�e en argument ce peut �tre une donn�e 
	 * ou une actualit�, si la donn�e existe d�j� on ne fait rien
	 * @param aAjouter, la donn�e a ajout�
	 */
	public void addDonnee(Donnee aAjouter) {
		donnees.add(aAjouter);
	}
	
	/**
	 * teste si une donn�e existe d�j� 
	 * @param aAjouter
	 * @return true si elle n'existe pas, false sinon
	 */
	public boolean notExistD(Donnee aAjouter) {
		boolean ok = true;
		for (int i = 0; i < donnees.size() && ok ; i++) {
			if (donnees.get(i).getLabel().equals(aAjouter.getLabel())) {
				ok = false;
			}
		}
		return ok;
	}
	

	/**
	 * teste si une actus existe d�j� 
	 * @param aAjouter
	 * @return true si elle n'existe pas, false sinon
	 */
	public boolean notExistA(Actualite aAjouter) {
		boolean ok = true;
		for (int i = 0; i < actus.size() && ok ; i++) {
			if (actus.get(i).getLabel().equals(aAjouter.getLabel())) {
				ok = false;
			}
		}
		return ok;
	}
	
	/**
	 * Ajout d'une actualit�
	 * @param aAjouter
	 */
	public void addActu(Actualite aAjouter) {
		actus.add(aAjouter);
	}
	
	public void setListe(ArrayList<Donnee>don) {
		donnees = don;
	}
	
	/**
	 * Suppression d'une donn�es par rapport � son label
	 * @param nom, le label de la donn�e � supprimer
	 */
	public void suppDonnee(String nom) {
		for(int i = 0; i < donnees.size(); i++) {
			if(donnees.get(i).getLabel().equals(nom)) {
				donnees.remove(i);
			}
		}
	}
	
	/**
	 * Suppression d'un actualite par rapport � son label
	 * @param nom, le label de l'actu � supprimer
	 */
	public void suppActu(String nom) {
		for(int i = 0; i < actus.size(); i++) {
			if(actus.get(i).getLabel().equals(nom)) {
				actus.remove(i);
			}
		}
	}
	
	/**
	 * Rendre une donn�e fiable on va chercher la donn�es par rapport
	 * � son label puis appeler la m�thode devientValide()
	 * @param label, le lable de la donn�e
	 */
	public void donneeFiable(String label) {
		for (int i = 0; i < donnees.size(); i++) {
			// on a trouver la donn�e
			if (donnees.get(i).getLabel().equals(label)) {
				donnees.get(i).devientValide();
			}
		}
	}
	
	/**
	 * R�cup�ration des label de donn�es et de actualit� non valide
	 * @return une ArrayList de label
	 */
	public ArrayList<String> getDonneesNonValide() {
		ArrayList<String> resultat = new ArrayList<String>();
		// parcours des donn�es
		for(int i = 0; i < donnees.size(); i++) {
			if(!donnees.get(i).valide()) {
				resultat.add(donnees.get(i).getLabel());
			}
		}
		// parcours des actualites
		for(int i = 0; i < actus.size(); i++) {
			if(!actus.get(i).valide()) {
				resultat.add(actus.get(i).getLabel());
			}
		}
		return resultat;
	}
	public int getTaille() {
		return donnees.size();
	}
	
	/**
	 * Obtention de la liste de demande d'inscription d'enfants
	 * pour cette crèche
	 * @return une Arraylist de Personne
	 */
	public ArrayList<Personne> getListPers() {
		return enfants;
	}
	
	/**
	 * Ajout d'une personne
	 * @param Personne
	 */
	public void addPers(Personne p) {
		enfants.add(p);
	}
	
	/**
	 * Chercher une personne par son nom et son prenom
	 * @String nom
	 * @String Prenom
	 */
	public Personne getPers(String nom, String Prenom) {
		
		String nomPrenom = nom + " " + Prenom;
		
		for(Personne p : enfants) {
			p.getAdresse();
			
			if (nomPrenom.equals(p.getNom() + p.getPrenom())) 
				return p;
		}
		
		return null;
	}
	
	/**
	 * Chercher une personne par son nom et son prenom
	 * @String nomPrenom
	 */
	public Personne getPers(String nomPrenom) {
		
		for(Personne p : enfants)
		{
			if(nomPrenom.equals(  p.getNom()+ " " + p.getPrenom())) return p;
		}
		return null;
	}
	
	
	/**
	 * Chercher une personne par son nom et son prenom et le supprime
	 * @String nom
	 * @String Prenom
	 */
	public void deletePers(String nom, String Prenom) {
		
		String nomPrenom = nom + " " + Prenom;
		for(Personne p : enfants)
		{
			if(nomPrenom.equals(  p.getNom()+ " " + p.getPrenom())) enfants.remove(p);
		}
		
	}
	
	

	
	
}